package java_thinking.unit_15._15_10;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description :   无界通配符
 *                  <?> ：我是想用java的泛型来编写这段代码，我在这里并不是要用原生类型
 *                  但是在当前这种情况下，泛型参数可以持有任何类型
 *
 *                  当你在处理多个泛型参数时，有时允许一个参数可以是任何类型，同时为其他参数确定某种特定类型的
 *                  这种能力显得很重要
 * @author: cww
 * @DateTime: 2019-04-06 22:17
 */

public class _3_1_UnboundedWildcards {
    /**
     * 表示:持有任何Object类型的原生List
     */
    static List list1;
    /**
     * 表示:具有某种特定类型的非原生List
     */
    static List<?> list2;
    static List<? extends Object> list3;

    static void assign1(List list) {
        list1 = list;
        list2 = list;

        // warning: unchecked conversion
        // Found: List, Require: List<? extends Object>
        list3 = list;
    }

    static void assign2(List<?> list) {
        list1 = list;
        list2 = list;
        list3 = list;
    }

    static void assign3(List<? extends Object> list) {
        list1 = list;
        list2 = list;
        list3 = list;
    }


    public static void main(String[] args) {
        assign1(new ArrayList());
        assign2(new ArrayList());
        // warning: unchecked conversion
        // Found: ArrayList, Require: List<? extends Object>
        assign3(new ArrayList());

        assign1(new ArrayList<String>());
        assign2(new ArrayList<String>());
        assign3(new ArrayList<String>());

        List<?> wildList = new ArrayList();
        assign1(wildList);
        assign2(wildList);
        assign3(wildList);
    }
}
